//
// DotNetNuke - http://www.dotnetnuke.com
// Copyright (c) 2002-2010
// by Perpetual Motion Interactive Systems Inc. ( http://www.perpetualmotion.ca )
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated 
// documentation files (the "Software"), to deal in the Software without restriction, including without limitation 
// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and 
// to permit persons to whom the Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or substantial portions 
// of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 
// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF 
// CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
// DEALINGS IN THE SOFTWARE.
//

using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using DotNetNuke.Common.Utilities;
namespace DotNetNuke.UI.WebControls
{
	public class CheckBoxColumnTemplate : ITemplate
	{
		private bool mAutoPostBack = false;
		private bool mChecked = false;
		private string mDataField = Null.NullString;
		private bool mDesignMode;
		private bool mEnabled = true;
		private string mEnabledField = Null.NullString;
		private bool mHeaderCheckBox = true;
		private ListItemType mItemType = ListItemType.Item;
		private string mText = "";
		public CheckBoxColumnTemplate() : this(ListItemType.Item)
		{
		}
		public CheckBoxColumnTemplate(ListItemType itemType)
		{
			this.ItemType = itemType;
		}
		public event DNNDataGridCheckedColumnEventHandler CheckedChanged;
		public bool AutoPostBack {
			get { return mAutoPostBack; }
			set { mAutoPostBack= value; }
		}
		public bool Checked {
			get { return mChecked; }
			set { mChecked= value; }
		}
		public string DataField {
			get { return mDataField; }
			set { mDataField= value; }
		}
		public bool DesignMode {
			get { return mDesignMode; }
			set { mDesignMode= value; }
		}
		public bool Enabled {
			get { return mEnabled; }
			set { mEnabled= value; }
		}
		public string EnabledField {
			get { return mEnabledField; }
			set { mEnabledField= value; }
		}
		public bool HeaderCheckBox {
			get { return mHeaderCheckBox; }
			set { mHeaderCheckBox= value; }
		}
		public ListItemType ItemType {
			get { return mItemType; }
			set { mItemType= value; }
		}
		public string Text {
			get { return mText; }
			set { mText= value; }
		}
		public void InstantiateIn(Control container)
		{
			if (!String.IsNullOrEmpty(Text)) {
				container.Controls.Add(new LiteralControl(Text + "<br/>"));
			}
			if (ItemType != ListItemType.Header || (ItemType == ListItemType.Header && HeaderCheckBox)) {
				CheckBox box = new CheckBox();
				box.AutoPostBack = AutoPostBack;
				box.DataBinding += Item_DataBinding;
				box.CheckedChanged += OnCheckChanged;
				container.Controls.Add(box);
			}
		}
		private void Item_DataBinding(object sender, EventArgs e)
		{
			CheckBox box = (CheckBox)sender;
			DataGridItem container = (DataGridItem)box.NamingContainer;
			if (!String.IsNullOrEmpty(DataField) && ItemType != ListItemType.Header) {
				if (DesignMode) {
					box.Checked = false;
				} else {
					box.Checked = Convert.ToBoolean(DataBinder.Eval(container.DataItem, DataField));
				}
			} else {
				box.Checked = this.Checked;
			}
			if (!String.IsNullOrEmpty(EnabledField)) {
				if (DesignMode) {
					box.Enabled = false;
				} else {
					box.Enabled = Convert.ToBoolean(DataBinder.Eval(container.DataItem, EnabledField));
				}
			} else {
				box.Enabled = this.Enabled;
			}
		}
		private void OnCheckChanged(object sender, EventArgs e)
		{
			CheckBox box = (CheckBox)sender;
			DataGridItem container = (DataGridItem)box.NamingContainer;
			DNNDataGridCheckChangedEventArgs evntArgs;
			if (container.ItemIndex == Null.NullInteger) {
				evntArgs = new DNNDataGridCheckChangedEventArgs(container, box.Checked, DataField, true);
			} else {
				evntArgs = new DNNDataGridCheckChangedEventArgs(container, box.Checked, DataField, false);
			}
			if (CheckedChanged != null) {
				CheckedChanged(sender, evntArgs);
			}
		}
	}
}
